网络 > csharp AOT中的XML序列化

2025-04-02

玩具项目引入序列化后,开始体会到CSharp的AOT的蛋疼了。所以也明白CSharp之父做的TSChekcer为啥要用golang不用csharp了。

两门语言对待AOT的优先级上的确不同,CSharp的AOT只是能用,绝对不是优势。

实现,CSharp开启AOT后,反射的功能就开始受限,这对于序列化的影响很大,解决方案是必须显示的指定可能用到的类。

第一个会出现的错误是,报找不到空参数构造函数。

 ---> System.InvalidOperationException: HellMapManager.Models.Map cannot be serialized because it does not have a parameterless constructor.

本质是因为没有指定可能使用的类型(以及子类中可能没指定)。

需要引入

using System.Diagnostics.CodeAnalysis;

然后在类定义中显示的指明

public partial class Map

{

    [DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(Map))]

    [DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(MapInfo))]

    [DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(Alias))]

    [DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(Room))]

    [DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(Exit))]

    [DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(Route))]

    [DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(Variable))]

    [DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(Landmark))]

然后可能遇到的问题是提示

 ---> System.InvalidOperationException: You must implement a default accessor on System.Collections.Generic.List`1[[HellMapManager.Models.Room, HellMapManager, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]] because it inherits from ICollection.

这是需要在使用XML元素的地方显式指定类型

    [XmlArray(ElementName = "Rooms")]

    [XmlArrayItem(typeof(Room))]

    public List<Room> Rooms { get; set; } = [];

继续写,继续踩坑。

 

点击登录